﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Film.Repository;
using AjaxControlToolkit;
using System.Data;
using codeding.KMeans.DataStructures;
using codeding.KMeans.DataStructures.Lists;
using System.Collections;

namespace PhuongDoAn
{
    public partial class Suggestions : System.Web.UI.Page
    {
        public string loginUrl = "uc/uc_login.ascx";
        public string registerurl = "UC/register.ascx";
        public string ratingurl = "UC/uc_rating.ascx";
        public string homepage_content = "uc/uc_home.ascx";
        public string homepage_left = "uc/uc_left.ascx";
        public string homepage_right = "uc/uc_right.ascx";
        public string homepage_header = "uc/uc_header.ascx";
        public string advanceSearchUrl = "uc/uc_advanceSearch.ascx";
        public string listUrl = "uc/uc_list.ascx";
        public string detailUrl = "uc/uc_detail.ascx";
        tblMovieRepository _movieService = new tblMovieRepository();
        tblRatingRepository _ratingService = new tblRatingRepository();
        int pageSize = Util.pageSize;
        int pageSegSize = 1;
        public int count = 0;
        int pageCount = 0;


        public int NumberOfComent = 0;

        public int CurrentPage
        {
            get
            {
                if (this.ViewState["CurrentPage"] == null)
                    return 0;
                else
                    return Convert.ToInt16(this.ViewState["CurrentPage"].ToString());
            }
            set { this.ViewState["CurrentPage"] = value; }
        }
        PagedDataSource pds = new PagedDataSource();

        protected void Page_Load(object sender, EventArgs e)
        {
            plcHeader.Controls.Add(LoadControl(homepage_header));
            plcLeft.Controls.Add(LoadControl(homepage_left));
            plcRight.Controls.Add(LoadControl(homepage_right));
            //
            if (!IsPostBack)
                LoadList();
        }

        private DataTable SapXepGiam(DataTable dtRecomment)
        {
            dtRecomment.DefaultView.Sort = "DoQuanTam";
            return dtRecomment.DefaultView.ToTable();
        }

        void LoadList()
        {
           
            if (Session[ConfigKey.WEB_USER] == null)
            {
                Response.Redirect("Default.aspx?page=login");
            }
            tblUserAccount account = (tblUserAccount)Session[ConfigKey.WEB_USER];
             //Xem người dùng này đánh giá bao nhiêu phim
            tblRatingRepository tblRatingRes = new tblRatingRepository();
            NumberOfComent = tblRatingRes.GetRatingByUserID(account.UserID).Count;

            BuildMatrixDoQuanTam doQuanTam = null;
            if (account.UserName.ToUpper().Contains("OFFLINE"))  //CSDL được đánh dấu là cần tính lại
            {
                doQuanTam = new BuildMatrixDoQuanTam(account.UserID, false);
                //Reset lai de lan sau khong can tinh lai nua
                Config.NeedReCanculateRecomment = 0;
            }
            else
                doQuanTam = new BuildMatrixDoQuanTam(account.UserID, true);

            DataTable dtRecomment = new DataTable();
            dtRecomment.Columns.Add("MovieID", typeof(int));
            dtRecomment.Columns.Add("DoQuanTam", typeof(double));
            for (int i = 1; i < doQuanTam._SoCot; i++)
            {
                DataRow row = dtRecomment.NewRow();
                row["MovieID"] = i;
                row["DoQuanTam"] = doQuanTam._MaTran[account.UserID, i];
                dtRecomment.Rows.Add(row);
            }

            //Sắp xếp lại độ quan tâm theo thứ tự giảm dần
            dtRecomment = SapXepGiam(dtRecomment);

            List<tblMovieTemp> lstRecomment = new List<tblMovieTemp>();
            int index = 0, temp = 0;

            //Lấy ra các film đã được người dùng comment
            List<int> listMovieRecomment = _movieService.GetAllRecomment(account.UserID).Where(c => c.Status).Select(c => c.MovieID).ToList(); 
            //Lấy tất cả các phim ra để đối sánh
            List<tblMovieTemp> listAllMovies = _movieService.GetAllTempMovies();
            
            //Lọc những phim mà người dùng này chưa xem, vẫn theo thứ tự sắp giảm DoQuanTam
            tblMovieTemp _item;
            for (int i = 0; i < dtRecomment.Rows.Count - 1; i++)
            {
                temp = (int)dtRecomment.Rows[i]["MovieID"];
                if (temp != 0 && !listMovieRecomment.Contains(temp))
                {
                    _item = listAllMovies.Where(c => c.MovieID == temp).FirstOrDefault();
                    if (_item != null)
                        lstRecomment.Add(_item);
                }
            }

            //Lấy ra 20 film có độ quan tâm lớn nhất
            var objTemp = lstRecomment.Skip(0).Take(19).ToList();
            count = objTemp.Count();
            //
            pds.DataSource = objTemp;
            pds.AllowPaging = true;
            pds.PageSize = pageSize;
            pds.CurrentPageIndex = CurrentPage;
                   
            rptRating.DataSource = pds;
            rptRating.DataBind();
            if(!IsPostBack)
                doPaging();
        }

        private void doPaging()
        {
            pageCount = pds.PageCount;
            if (count <= pageSize * 1)
            {
                cbPaging.Visible = false;
            }
            else
            {
                cbPaging.Items.Clear();
                lblTotalPage.Text = string.Format("{0} trang", pageCount);
                for (int i = 1; i <= pageCount; i++)
                {
                    cbPaging.Items.Add(i.ToString());
                }
            }
        }

        protected void btnCapNhat_Click(object sender, EventArgs e)
        {
            try
            {
                if (Session[ConfigKey.WEB_USER] != null)
                {
                    tblUserAccount account = (tblUserAccount)Session[ConfigKey.WEB_USER];

                    //
                    string appent = "";
                    List<tblRating> rating = new List<tblRating>();
                    foreach (RepeaterItem item in rptRating.Items)
                    {
                        Rating rf = (Rating)item.FindControl("rMyRate");
                        DropDownList dr = (DropDownList)item.FindControl("drState");
                        HiddenField hf = (HiddenField)item.FindControl("hfID");
                        if (hf != null && rf != null && dr != null)
                        {
                            tblRating rate = new tblRating();
                            rate.MovieID = Convert.ToInt32(hf.Value);
                            rate.Rating = rf.CurrentRating;
                            rate.Status = dr.Text == "2" ? true : false;
                            rate.UserID = account.UserID;
                            rating.Add(rate);
                            //rf.CurrentRating
                            //appent = string.Format("{0}-{1}", appent, hf.Value);
                            //appent = string.Format("{0}-{1}", appent, dr.Text);
                            //appent = string.Format("{0}-{1}", appent, rf.CurrentRating);
                        }
                    }
                    _ratingService.AddList(rating, account.UserID);
                    lblThongBao.Text = "Đánh giá thành công";
                    //Response.Write(rMyRate1.CurrentRating);
                    //lblThongBao.Text = appent;
                }
                else
                    Response.Redirect("Default.aspx?page=login");
            }
            catch (Exception)
            {
                lblThongBao.Text = "Đánh giá không thành công. Có lỗi xảy ra trong quá trình đánh giá.";
            }

            
        }
        protected void cbPaging_SelectedIndexChanged(object sender, EventArgs e)
        {
            CurrentPage = cbPaging.SelectedIndex;
            LoadList();
        }   
    }
    
}